package com.mjf.spark.day05

import org.apache.spark.rdd.RDD
import org.apache.spark.{Dependency, SparkConf, SparkContext}

/**
 * 查看血缘关系和依赖关系
 *    -窄依赖
 *      父RDD的一个分区只被子RDD的一个分区处理
 *    -宽依赖
 *      父RDD的一个分区被子RDD的多个分区处理，一般会发生shuffle
 */
object Spark04_TestLineage {
  def main(args: Array[String]): Unit = {

    // 创建SparkConf配置文件
    val conf = new SparkConf().setMaster("local[*]").setAppName("")
    // 创建SparkContext对象
    val sc = new SparkContext(conf)

    val rdd: RDD[String] = sc.makeRDD(List("hello spark", "hello lucy"), 2)

    val flatMapRDD: RDD[String] = rdd.flatMap(_.split(" "))   // OneToOneDependency
    println(flatMapRDD.dependencies)

    val resRDD: RDD[(String, Int)] = rdd.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)

    // 查看RDD的血缘关系
    val lineage: String = resRDD.toDebugString
    println(lineage)

    // 查看RDD的依赖关系
    val dep: Seq[Dependency[_]] = resRDD.dependencies   // ShuffleDependency
    println(dep)

    // 关闭连接
    sc. stop()

  }
}
